package hygprs

import (
	"strconv"
	"time"
)

/*
通用的解析方式，通过共用的字段进行解析
不能保证完全正确
*/
type General struct {
	fields   map[byte][]byte
	leftover []byte
}

func MakeGeneral(data []byte) General {
	g := General{}
	g.fields, g.leftover = ParseFields(data)
	return g
}

// 指定字段的编号和长度，获取指定字段的值，如果不匹配会返回指定长度的零值的切片
func (g General) Bytes(k byte, num int) []byte {
	if v, ok := g.fields[k]; ok && len(v) == num {
		return v
	}
	return make([]byte, num)
}

func (g General) Byte(k byte) byte {
	if v, ok := g.fields[k]; ok && len(v) == 1 {
		return v[0]
	}
	return 0x00
}

func (g General) Uint16(k byte) uint16 {
	return ToUint16(g.Bytes(k, 2))
}

func (g General) Uint32(k byte) uint32 {
	return ToUint32(g.Bytes(k, 4))
}

// 指定字段的编号，将数据转换成整数类型
func (g General) Int(k byte) int {
	if v, ok := g.fields[k]; ok {
		return ToInt(v)
	}
	return 0
}

// 指定字段的编号，将数据转换成整数形式的字符串
func (g General) String(k byte) string {
	if v, ok := g.fields[k]; ok {
		return strconv.Itoa(ToInt(v))
	}
	return "0"
}

func (g General) Time(k byte) time.Time {
	return time.Unix(int64(g.Int(k)), 0)
}

func (g General) IsPos() bool {
	v, ok := g.fields[0x03]
	return ok && (v[0] == 0x00 || v[0] == 0x30 || v[0] == 0x31)
}
